Smart Pointers: std::unique_ptr, std::shared_ptr, এবং std::weak_ptr

Computer Programming - সি++ স্ট্যান্ডার্ড লাইব্রেরি (C++ Standard Library) Utility Libraries (ইউটিলিটি লাইব্রেরি) |
88
88

C++-এ স্মার্ট পয়েন্টার (Smart Pointers) এমন পয়েন্টার যা মেমরি ম্যানেজমেন্ট সহজ করে এবং স্মৃতি রিকল (memory leaks) বা ডাবল ডিলিট (double delete) সমস্যা প্রতিরোধ করে। C++11 থেকে, std::unique_ptr, std::shared_ptr, এবং std::weak_ptr এই তিনটি স্মার্ট পয়েন্টার স্ট্যান্ডার্ড লাইব্রেরির অংশ হিসেবে অন্তর্ভুক্ত হয়েছে, এবং তারা মেমরি পরিচালনার ক্ষেত্রে অনেক সুবিধা প্রদান করে। এই স্মার্ট পয়েন্টারগুলি স্বয়ংক্রিয়ভাবে মেমরি রিলিজ করে, যখন এটি আর ব্যবহৃত হয় না।

নিচে এই স্মার্ট পয়েন্টারগুলির ব্যাখ্যা এবং উদাহরণ দেওয়া হলো:


১. std::unique_ptr

std::unique_ptr একটি স্মার্ট পয়েন্টার যা একক মালিকানায় একটি অবজেক্টের মালিকানার প্রতিনিধিত্ব করে। এটি এমন একটি পয়েন্টার যা এক সময়ে শুধুমাত্র একটি অবজেক্টের মালিক হতে পারে। মালিকানার স্থানান্তর করা যেতে পারে, তবে একাধিক unique_ptr একই অবজেক্টের মালিক হতে পারে না।

বৈশিষ্ট্য:

  • একক মালিকানা: শুধুমাত্র একটি unique_ptr এক সময়ে একটি অবজেক্টের মালিক হতে পারে।
  • অটো ডিলিট: যখন unique_ptr জীবনাবসান ঘটে, তখন এটি নিজে থেকেই সংশ্লিষ্ট অবজেক্টকে ডিলিট করে।
  • মালিকানা স্থানান্তর: মালিকানা এক unique_ptr থেকে অন্য unique_ptr এ স্থানান্তর করা যেতে পারে, তবে এটি কপি করা সম্ভব নয়।

উদাহরণ:

#include <iostream>
#include <memory>

class MyClass {
public:
    MyClass() { std::cout << "Constructor called!" << std::endl; }
    ~MyClass() { std::cout << "Destructor called!" << std::endl; }
    void show() { std::cout << "MyClass object is here!" << std::endl; }
};

int main() {
    std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();  // unique_ptr তৈরি
    ptr1->show();  // অবজেক্টের মেথড কল

    // মালিকানা স্থানান্তর করা
    std::unique_ptr<MyClass> ptr2 = std::move(ptr1);  // ptr1 থেকে ptr2 তে মালিকানা স্থানান্তর

    if (!ptr1) {
        std::cout << "ptr1 no longer owns the object." << std::endl;
    }

    return 0;
}

আউটপুট:

Constructor called!
MyClass object is here!
Destructor called!

২. std::shared_ptr

std::shared_ptr একটি স্মার্ট পয়েন্টার যা অনেকগুলি মালিকানায় একটি অবজেক্টের মালিকানা প্রতিনিধিত্ব করে। এটি একই অবজেক্টের জন্য একাধিক shared_ptr তৈরি করতে দেয় এবং সমস্ত shared_ptr যখন অবজেক্টটি আর ব্যবহার করা হয় না, তখন ঐ অবজেক্টের মেমরি মুক্ত করা হয়। এটি রেফারেন্স কাউন্টিং ব্যবহার করে, যাতে একটি অবজেক্টের জন্য কতগুলি shared_ptr রয়েছে তা ট্র্যাক করা হয়।

বৈশিষ্ট্য:

  • অনেক মালিকানা: একাধিক shared_ptr একই অবজেক্টের মালিক হতে পারে।
  • রেফারেন্স কাউন্টিং: অবজেক্টের মালিকানার সংখ্যা ট্র্যাক করা হয় এবং সব মালিকানার পর অবজেক্ট মুছে ফেলা হয়।

উদাহরণ:

#include <iostream>
#include <memory>

class MyClass {
public:
    MyClass() { std::cout << "Constructor called!" << std::endl; }
    ~MyClass() { std::cout << "Destructor called!" << std::endl; }
    void show() { std::cout << "MyClass object is here!" << std::endl; }
};

int main() {
    std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>();  // shared_ptr তৈরি
    ptr1->show();

    {
        std::shared_ptr<MyClass> ptr2 = ptr1;  // ptr1 এর মালিকানা ptr2 তে স্থানান্তর
        std::cout << "Inside block, use_count: " << ptr1.use_count() << std::endl;
    }  // ptr2 বাহির হয়ে যায়

    std::cout << "Outside block, use_count: " << ptr1.use_count() << std::endl;

    return 0;
}

আউটপুট:

Constructor called!
MyClass object is here!
Inside block, use_count: 2
Outside block, use_count: 1
Destructor called!

৩. std::weak_ptr

std::weak_ptr একটি স্মার্ট পয়েন্টার যা shared_ptr এর মালিকানার অংশীদার হিসেবে কাজ করে, কিন্তু এটি রেফারেন্স কাউন্টিংয়ে অংশগ্রহণ করে না। এটি মূলত সাইক্লিক রেফারেন্স (circular references) এড়াতে ব্যবহৃত হয়। যখন একটি weak_ptr থেকে অবজেক্ট অ্যাক্সেস করা হয়, তখন এটি একটি shared_ptr তৈরি করতে পারে, তবে এটি কোনো রেফারেন্স কাউন্টিং বাড়ায় না।

বৈশিষ্ট্য:

  • রেফারেন্স কাউন্টিংয়ে অংশগ্রহণ করে না: weak_ptr রেফারেন্স কাউন্টিং বাড়ায় না, তাই এটি সাইক্লিক রেফারেন্সের সমস্যা সৃষ্টি করে না।
  • shared_ptr থেকে অ্যাক্সেস: weak_ptr থেকে অবজেক্ট অ্যাক্সেস করতে হলে, একটি shared_ptr তৈরি করতে হয়।

উদাহরণ:

#include <iostream>
#include <memory>

class MyClass {
public:
    MyClass() { std::cout << "Constructor called!" << std::endl; }
    ~MyClass() { std::cout << "Destructor called!" << std::endl; }
    void show() { std::cout << "MyClass object is here!" << std::endl; }
};

int main() {
    std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>();  // shared_ptr তৈরি
    std::weak_ptr<MyClass> weakPtr = ptr1;  // weak_ptr তৈরি

    std::cout << "Use count before: " << ptr1.use_count() << std::endl;

    if (auto temp = weakPtr.lock()) {  // weak_ptr থেকে shared_ptr তৈরি
        temp->show();
    } else {
        std::cout << "Object no longer exists!" << std::endl;
    }

    ptr1.reset();  // shared_ptr এর মালিকানা শেষ

    std::cout << "Use count after: " << ptr1.use_count() << std::endl;

    if (auto temp = weakPtr.lock()) {
        temp->show();
    } else {
        std::cout << "Object no longer exists!" << std::endl;
    }

    return 0;
}

আউটপুট:

Constructor called!
Use count before: 1
MyClass object is here!
Use count after: 0
Object no longer exists!
Destructor called!

স্মার্ট পয়েন্টারের উপকারিতা:

  1. অটোমেটিক মেমরি ম্যানেজমেন্ট: স্মার্ট পয়েন্টারগুলি ম্যানুয়ালি মেমরি ম্যানেজমেন্টের প্রয়োজন কমিয়ে দেয়, যেমন মেমরি রিকল বা ডাবল ডিলিট সমস্যা।
  2. সাইক্লিক রেফারেন্স এড়ানো: std::weak_ptr সাইক্লিক রেফারেন্সের সমস্যা প্রতিরোধ করে, যা std::shared_ptr এর মাধ্যমে তৈরি হতে পারে।
  3. বিনামূল্যে অবজেক্ট রিলিজ: যখন স্মার্ট পয়েন্টারটি স্কোপের বাইরে চলে যায়, এটি অবজেক্টের মেমরি মুক্ত করে দেয়।

উপসংহার:

  • std::unique_ptr: একক মালিকানার পয়েন্টার, যা মালিকানার স্থানান্তর করতে পারে, কিন্তু কপি করা যায় না।
  • std::shared_ptr: একাধিক মালিকানার পয়েন্টার, যা রেফারেন্স কাউন্টিং ব্যবহার করে অবজেক্টটি মুছে ফেলা হয় যখন সমস্ত shared_ptr শেষ হয়।
  • std::weak_ptr: shared_ptr থেকে সম্পর্কিত পয়েন্টার, তবে এটি রেফারেন্স কাউন্টিংয়ে অংশগ্রহণ করে না, যা সাইক্লিক রেফারেন্স এড়াতে সাহায্য করে।

এই স্মার্ট পয়েন্টারগুলি C++ কোডে মেমরি ম্যানেজমেন্ট সহজ, নিরাপদ, এবং দক্ষ করে তোলে।

Content added By
Promotion